﻿Imports Commander_Wars.Spieletools
Public MustInherit Class ObjektKOBeschreibung
    Structure DoppelGabesatz
        Public Sub New(ByVal KOID1 As String, ByVal KOID2 As String, ByVal KOSatz1 As String, ByVal KOSatz2 As String)
            Me.KOID1 = KOID1
            Me.KOID2 = KOID2
            Me.KOSatz1 = KOSatz1
            Me.KOSatz2 = KOSatz2
        End Sub
        Public KOID1 As String
        Public KOID2 As String
        Public KOSatz1 As String
        Public KOSatz2 As String
    End Structure

    Public Name As String = ""
    Public Beschreibung As String() = {}
    Public Stil As String() = {}
    Public Fein As String = ""
    Public Nein As String = ""
    Public Gabebeschreibung As String() = {}
    Public SpezialgabeBeschreibung As String() = {}
    Public GabeKosten As Integer = 0
    Public Spezialgabekosten As Integer = 0
    Public Synergie() As Decimal = {}
    Public KONamen As String() = {}
    Public Doppelgabenamen As String() = {}
    Public Gabesätze As String() = {}
    Public Tauschsätze() As String = {}
    Public Siegsätze() As String = {}
    Public Doppelgabesätze As DoppelGabesatz() = {}
    Public Gaben() As String
    ''' <summary>
    ''' Gibt die Synergie zwischen den beiden KO's zurück
    ''' </summary>
    ''' <param name="KO1"></param>
    ''' <param name="KO2"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function GetSynergie(ByVal KO1 As Objektverwalter.KO, ByVal KO2 As Objektverwalter.KO) As Decimal
        Dim D1 As Decimal = 0
        For I = 0 To KO1.KOBeschreibung.KONamen.Length - 1
            If KO2.KOID.ToUpper = KO1.KOBeschreibung.KONamen(I).ToUpper Then
                If I < KO1.KOBeschreibung.Synergie.Length Then
                    D1 = KO1.KOBeschreibung.Synergie(I)
                End If
            End If
        Next
        Dim D2 As Decimal = 0
        For I = 0 To KO2.KOBeschreibung.KONamen.Length - 1
            If KO1.KOID.ToUpper = KO2.KOBeschreibung.KONamen(I).ToUpper Then
                If I < KO2.KOBeschreibung.Synergie.Length Then
                    D2 = KO2.KOBeschreibung.Synergie(I)
                End If
            End If
        Next
        If D1 < D2 Then
            Return D1
        Else
            Return D2
        End If
    End Function
    ''' <summary>
    ''' Gibt den Doppelgabenamen der beiden KO's zurück
    ''' </summary>
    ''' <param name="KO1"></param>
    ''' <param name="KO2"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function GetDoppelgabeName(ByVal KO1 As Objektverwalter.KO, ByVal KO2 As Objektverwalter.KO) As String
        Dim Name As String = Sprachconverter.Translate("Doppel-Gabe")
        For I = 0 To KO1.KOBeschreibung.KONamen.Length - 1
            If KO1.KOBeschreibung.KONamen(I).ToUpper = KO2.KOID.ToUpper Then
                If I < KO1.KOBeschreibung.Doppelgabenamen.Length Then
                    Return KO1.KOBeschreibung.Doppelgabenamen(I)
                End If
            End If
        Next
        For I = 0 To KO2.KOBeschreibung.KONamen.Length - 1
            If KO2.KOBeschreibung.KONamen(I).ToUpper = KO1.KOID.ToUpper Then
                If I < KO2.KOBeschreibung.Doppelgabenamen.Length Then
                    Return KO2.KOBeschreibung.Doppelgabenamen(I)
                End If
            End If
        Next
        Return Name
    End Function
    Structure GabeSynergieBeschreibungen
        Dim KONAme As String
        Dim Synergie As Decimal
        Dim Breite As Integer
        Dim KOID As String
        Public Sub New(ByVal KONAme As String, ByVal Synergie As Decimal, ByVal Breite As Integer, ByVal KOID As String)
            Me.KONAme = KONAme
            Me.Synergie = Synergie
            Me.Breite = Breite
            Me.KOID = KOID
        End Sub
    End Structure
    ''' <summary>
    ''' Gibt alle Synergien zurück, die einer Spezialdoppelgabe zugeordnet sind.
    ''' </summary>
    ''' <param name="KO"></param>
    ''' <param name="Text"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function GetGabeSynergieBeschreibungen(ByVal KO As Objektverwalter.KO, Optional ByVal Text As ObjektText = Nothing) As GabeSynergieBeschreibungen()
        Dim R As New Stack(Of GabeSynergieBeschreibungen)
        For I = 0 To KO.KOBeschreibung.KONamen.Length - 1
            If I < KO.KOBeschreibung.Doppelgabenamen.Length Then
                Dim S As String = Sprachconverter.TranslateIntoGerman(KO.KOBeschreibung.Doppelgabenamen(I)).ToLower
                If S <> "Doppel-Gabe".ToLower And S <> "Doppelgabe".ToLower Then
                    'Eine Doppelgabe gefunden.
                    Dim Breite As Integer = 0
                    Dim Name As String = ObjektLadeklasse.GetKONameByKOID(KO.KOBeschreibung.KONamen(I))
                    If Text IsNot Nothing Then
                        Breite = Text.GetSchriftart.MeasureString(Schriftengine.Sprite2, Name, Microsoft.DirectX.Direct3D.DrawTextFormat.None, Color.Black).Width
                    End If
                    Dim ID As Integer = ObjektLadeklasse.GetKOID(KO.KOBeschreibung.KONamen(I))
                    If ID >= 0 Then
                        R.Push(New GabeSynergieBeschreibungen(Name, GetSynergie(KO, Objektverwalter.KOS(ID)), Breite, KO.KOBeschreibung.KONamen(I)))
                    End If
                End If
            End If
        Next
        For I = 0 To Objektverwalter.KOS.Length - 1
            If Not ContainsKO(R, I) Then
                Dim Z As Integer = Array.IndexOf(Objektverwalter.KOS(I).KOBeschreibung.KONamen, KO.KOID)
                If Z >= 0 Then
                    If Z < Objektverwalter.KOS(I).KOBeschreibung.Doppelgabenamen.Length - 1 Then
                        Dim S As String = Sprachconverter.TranslateIntoGerman(Objektverwalter.KOS(I).KOBeschreibung.Doppelgabenamen(Z)).ToLower
                        If S.ToLower <> "Doppel-Gabe".ToLower And S.ToLower <> "Doppelgabe".ToLower Then
                            Dim Breite As Integer = 0
                            Dim Name As String = ObjektLadeklasse.GetKONameByKOID(Objektverwalter.KOS(I).KOID)
                            If Text IsNot Nothing Then
                                Breite = Text.GetSchriftart.MeasureString(Schriftengine.Sprite2, Name, Microsoft.DirectX.Direct3D.DrawTextFormat.None, Color.Black).Width
                            End If
                            R.Push(New GabeSynergieBeschreibungen(Name, GetSynergie(KO, Objektverwalter.KOS(I)), Breite, I))
                        End If
                    End If
                End If
            End If
        Next
        Return R.ToArray
    End Function
    Private Shared Function ContainsKO(ByVal R As Stack(Of GabeSynergieBeschreibungen), ByVal KOID As Integer) As Boolean
        For I = 0 To R.Count - 1
            If R(I).KOID = Objektverwalter.KOS(KOID).KOID Then
                Return True
            End If
        Next
        Return False
    End Function
    Public Sub LoadNewDesc(ByVal File As String)
        Dim KleinerText As ObjektText = Nothing
        If Grafikengine.Grafikkarte IsNot Nothing Then
            KleinerText = New ObjektText(New String() {}, 0, 0, Nothing, "Arial Unicode MS", 8, FontStyle.Regular)
        End If
        Using Reader As New System.IO.StreamReader(File)
            While Not Reader.EndOfStream
                Dim Zeile As String = Reader.ReadLine.Trim
                If Zeile.ToLower.StartsWith("name:") Then
                    Name = Zeile.Remove(0, 5)
                    Continue While
                End If
                If Zeile.ToLower.StartsWith("fein:") Then
                    Fein = Zeile.Remove(0, 5)
                    Continue While
                End If
                If Zeile.ToLower.StartsWith("nein:") Then
                    Nein = Zeile.Remove(0, 5)
                    Continue While
                End If

                If Zeile.ToLower.StartsWith("gaben:") Then
                    Gaben = Zeile.Remove(0, 6).Split("|")
                    Continue While
                End If

                If Zeile.ToLower.StartsWith("beschreibung:") Then
                    Zeile = Zeile.Remove(0, 13)
                    If KleinerText IsNot Nothing Then
                        Beschreibung = ObjektText.getStringsZeilenweise(Zeile, KleinerText.GetSchriftart, 175)
                    End If
                    Continue While
                End If
                If Zeile.ToLower.StartsWith("stil:") Then
                    Zeile = Zeile.Remove(0, 5)
                    If KleinerText IsNot Nothing Then
                        Stil = ObjektText.getStringsZeilenweise(Zeile, KleinerText.GetSchriftart, 175)
                    End If
                    Continue While
                End If
                If Zeile.ToLower.StartsWith("gabebeschreibung:") Then
                    Zeile = Zeile.Remove(0, 17)
                    If KleinerText IsNot Nothing Then
                        Gabebeschreibung = ObjektText.getStringsZeilenweise(Zeile, KleinerText.GetSchriftart, 175)
                    End If
                    Continue While
                End If
                If Zeile.ToLower.StartsWith("spezialgabebeschreibung:") Then
                    Zeile = Zeile.Remove(0, 24)
                    If KleinerText IsNot Nothing Then
                        SpezialgabeBeschreibung = ObjektText.getStringsZeilenweise(Zeile, KleinerText.GetSchriftart, 175)
                    End If
                    Continue While
                End If
                If Zeile.ToLower.StartsWith("gabesätze:") Then
                    Gabesätze = Zeile.Remove(0, 10).Split("|")
                    Continue While
                End If
                If Zeile.ToLower.StartsWith("siegsätze:") Then
                    Siegsätze = Zeile.Remove(0, 10).Split("|")
                    Continue While
                End If
                If Zeile.ToLower.StartsWith("tauschsätze:") Then
                    Tauschsätze = Zeile.Remove(0, 12).Split("|")
                    Continue While
                End If
                If Zeile.ToLower.StartsWith("doppelgabesätze:") Then
                    'Das hier mache ich noch
                    Array.Resize(Doppelgabesätze, 0)
                    Dim Sätze As String() = Zeile.Remove(0, 16).Split("|")
                    Array.Resize(Doppelgabesätze, Math.DivRem(Sätze.Length, 4, 0))
                    For I2 = 0 To Doppelgabesätze.Length - 1
                        Doppelgabesätze(I2) = New DoppelGabesatz(Sätze(I2 * 4 + 0), Sätze(I2 * 4 + 1), Sätze(I2 * 4 + 2), Sätze(I2 * 4 + 3))
                    Next
                    Continue While
                End If

                If Zeile.ToLower.StartsWith("doppelgabenamen:") Then
                    Doppelgabenamen = Zeile.Remove(0, 16).Split("|")
                    Continue While
                End If
                If Zeile.ToLower.StartsWith("doppelgabenkoid:") Then
                    KONamen = Zeile.Remove(0, 16).Split("|")
                    Continue While
                End If
                If Zeile.ToLower.StartsWith("gabekosten:") Then
                    GabeKosten = Zeile.Remove(0, 11)
                    Continue While
                End If
                If Zeile.ToLower.StartsWith("spezialgabekosten:") Then
                    Spezialgabekosten = Zeile.Remove(0, 18)
                    Continue While
                End If
                If Zeile.ToLower.StartsWith("synergie:") Then
                    Synergie = ToDecArry(Zeile.Remove(0, 9).Split("|"))
                    Continue While
                End If
            End While
        End Using
    End Sub
End Class
